import datetime
from apps.extensions import db

class Task(db.Model):
    """
    定时任务模型
    用于存储和管理定时任务信息
    """
    __tablename__ = 'sys_task'
    
    id = db.Column(db.String(100), primary_key=True)  # 任务ID
    name = db.Column(db.String(100), nullable=False)  # 任务名称
    func = db.Column(db.String(200), nullable=False)  # 任务函数
    args = db.Column(db.Text)  # 函数参数(JSON格式)
    kwargs = db.Column(db.Text)  # 函数关键字参数(JSON格式)
    trigger = db.Column(db.String(20), nullable=False)  # 触发器类型: date, interval, cron
    trigger_args = db.Column(db.Text)  # 触发器参数(JSON格式)
    start_date = db.Column(db.DateTime)  # 开始时间
    end_date = db.Column(db.DateTime)  # 结束时间
    next_run_time = db.Column(db.DateTime)  # 下次运行时间
    misfire_grace_time = db.Column(db.Integer, default=1)  # 错过执行时间容忍度(秒)
    coalesce = db.Column(db.Boolean, default=True)  # 是否合并执行
    max_instances = db.Column(db.Integer, default=1)  # 最大实例数
    timezone = db.Column(db.String(50), default='Asia/Shanghai')  # 时区
    enabled = db.Column(db.Boolean, default=True)  # 是否启用
    created_at = db.Column(db.DateTime, default=datetime.datetime.now)  # 创建时间
    updated_at = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now)  # 更新时间
    
    def __repr__(self):
        return f'<Task {self.id}: {self.name}>'
    
    def to_dict(self):
        """转换为字典格式"""
        return {
            'id': self.id,
            'name': self.name,
            'func': self.func,
            'args': self.args,
            'kwargs': self.kwargs,
            'trigger': self.trigger,
            'trigger_args': self.trigger_args,
            'start_date': self.start_date.strftime('%Y-%m-%d %H:%M:%S') if self.start_date else None,
            'end_date': self.end_date.strftime('%Y-%m-%d %H:%M:%S') if self.end_date else None,
            'next_run_time': self.next_run_time.strftime('%Y-%m-%d %H:%M:%S') if self.next_run_time else None,
            'misfire_grace_time': self.misfire_grace_time,
            'coalesce': self.coalesce,
            'max_instances': self.max_instances,
            'timezone': self.timezone,
            'enabled': self.enabled,
            'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else None,
            'updated_at': self.updated_at.strftime('%Y-%m-%d %H:%M:%S') if self.updated_at else None
        }
